package template.dao;

import java.io.Serializable;
import java.util.List;
import java.util.Map;

/**
 * 所有数据库操作的通用接口
 * 
 * @author smy
 * @version 1.0
 * @since 2009-04-23
 */
public interface IBaseDao {

	/**
	 * 保存对象
	 * 
	 * @param obj
	 *            要保存的对象
	 */
	public void save(Object obj);

	/**
	 * 修改对象
	 * 
	 * @param obj
	 *            要修改的對象
	 */
	public void update(Object obj);

	/**
	 * 刪除对象
	 * 
	 * @param obj
	 *            要刪除的对象
	 */
	public void remove(Object obj);

	/**
	 * 获取对象个数
	 * 
	 * @param countHql
	 *            能查询个数的hql语句 形如：select count（*）
	 * @return 对象个数
	 */
	public int getTotal(String countHql);

	/**
	 * 通过对象Id和类型和获取对象
	 * 
	 * @param <T>
	 *            对象类型参数
	 * @param id
	 *            对象id
	 * @param className
	 *            对象类型
	 * @return 对象
	 */
	public <T> T findById(Serializable id, Class<T> className);
	
	/**
	 * 获取所有的对象列表
	 * 
	 * @param <T>
	 *            类型参数
	 * @param hql
	 *            用于查询的hql语句
	 * @return 对象列表
	 */
	public <T> List<T> getRecordList(String hql);

	/**
	 * 获取指定长度的对象列表
	 * 
	 * @param <T>
	 *            类型参数
	 * @param hql
	 *            用于查询的hql语句
	 * @param beginIndex
	 *            起始行数
	 * @param recordLen
	 *            获取的数量
	 * @return 对象列表
	 */
	public <T> List<T> getRecordList(final String hql, final int beginIndex,
			final int recordLen);

	/**
	 * 判断某个对象在数据库中是否存在
	 * 
	 * @param object
	 *            要判断的对象
	 * @return 是否存在
	 */
	public boolean checkExist(Object object);

	/**
	 * 使用sql查询所有记录，以指定的对象列表的形式返回；
	 * 注意：在clazz中声明的属性都必须出现在查询中，可以不区分大小写，但是clazz不支持多态。
	 * 
	 * @param <T>
	 *            类型参数
	 * @param sql
	 *            用于查询的sql语句
	 * @param clazz
	 *            获取的查询列表里的对象类型
	 * @return 对象列表
	 */
	public <T> List<T> queryBySql(final String sql, final Class<T> clazz);

	/**
	 * 使用sql查询指定长度的记录，以指定的对象列表的形式返回；
	 * 注意：在clazz中声明的属性都必须出现在查询中，可以不区分大小写，但是clazz不支持多态。
	 * 
	 * @param <T>
	 *            类型参数
	 * @param sql
	 *            用于查询的sql语句
	 * @param clazz
	 *            获取的查询列表里的对象类型
	 * @param firstResult
	 *            起始行数
	 * @param maxResults
	 *            获取的数量
	 * @return 对象列表
	 */
	public <T> List<T> queryBySql(final String sql, final Class<T> clazz,
			final int firstResult, final int maxResults);

	/**
	 * 使用sql查询所有记录，以Map列表的形式返回
	 * 
	 * @param sql
	 * @return
	 */
	public List<Map> query(final String sql);

	/**
	 * 使用sql查询指定长度的记录，以Map列表的形式返回
	 * 
	 * @param sql
	 * @param firstResult
	 * @param maxResults
	 * @return
	 */
	public List<Map> query(final String sql, final int firstResult,
			final int maxResults);

	/**
	 * 使用sql语句获取对象个数
	 * 
	 * @param countSql
	 *            能查詢个数的sql語句
	 * @return 对象个数
	 */
	public int getTotalBySql(final String countSql);

	/**
	 * 使用hql语句进行批量添加,修改和删除
	 * 
	 * @param Hql
	 *            hql语句
	 * @return 操作影响的个数
	 */
	public int updateByHql(String Hql);

	/**
	 * 使用jdbc进行各种数据库的操作
	 * 
	 * @param sql
	 *            sql语句
	 */
	public void executeByJdbc(final String sql);

}

